﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RecursosHumanos
{
    public partial class frmPessoa : Form
    {
        private Request request;
        private Entidade origem;
        private int idPessoa;
        private string senhaAnt;

        private WBGEntities bd = new WBGEntities();

        public Usuario usuario = new Usuario();
        public Cliente cliente = new Cliente();
        public Fornecedor fornecedor = new Fornecedor();
        public Funcionario funcionario = new Funcionario();
        public Passageiro passageiro = new Passageiro();
        public Motorista motorista = new Motorista();

        public Pessoa pessoa = new Pessoa();

        public frmPessoa(Request req, Entidade orig)
        {
            request = req;
            origem = orig;
            InitializeComponent();
        }

        private void frmPessoa_Load(object sender, EventArgs e)
        {
            //tabControl1.TabPages.Remove(tabVinculos);
            tabControl1.TabPages.Remove(tabUsu);
            tabControl1.TabPages.Remove(tabFunc);

            if (request == Request.Inserir)
            {
                switch (origem)
                {
                    case Entidade.Usuario:
                        tabControl1.TabPages.Add(tabUsu);
                        cbAtivoUsuario.Checked = true;
                        break;
                    case Entidade.Funcionario:
                    case Entidade.Motorista:
                        tabControl1.TabPages.Add(tabFunc);
                        if (origem == Entidade.Motorista)
                            tabControl2.TabPages.Add(tabMotorista);
                        break;
                    case Entidade.Cliente:                        
                        break;
                    case Entidade.Passageiro:                        
                        break;
                    case Entidade.Fornecedor:
                        break;
                    default:
                        throw new Exception("Sem parâmetros para a inclusão.");
                }
            }
            else
            {
                switch (origem)
                {
                    case Entidade.Usuario:
                        idPessoa = usuario.idPessoa;
                        break;
                    case Entidade.Funcionario:
                    case Entidade.Motorista:
                        idPessoa = funcionario.idPessoa;
                        break;
                    case Entidade.Cliente:
                        idPessoa = cliente.idPessoa;
                        break;
                    case Entidade.Passageiro:
                        idPessoa = passageiro.idPessoa;
                        break;
                    case Entidade.Fornecedor:
                        idPessoa = fornecedor.idPessoa;
                        break;
                    default:
                        throw new Exception("Sem parâmetros para realizar a alteração/visualização.");
                }

                CarregaCampos();
            }
        }

        private void frmPessoa_KeyUp(object sender, KeyEventArgs e)
        {
            switch(e.KeyData)
            {
                case Keys.Escape:
                    this.Close();
                    break;
                case Keys.F5:
                    try
                    {
                        if (!CamposRequeridos())
                        {
                            return;
                        }

                        //Pedir senha anterior para poder alterar
                        //if (origem == Entidade.Usuario && senhaAnt != txtSenha.Text)
                        //{
                            
                        //}

                        CarregaRegistros(request == Request.Inserir);
                        MessageBox.Show("Registro gravado com sucesso.", "Concluído", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.InnerException.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    break;
            }
        }

        private bool CamposRequeridos()
        {
            if (txtNomePessoa.Text == "")
            {
                txtNomePessoa.Focus();
                return false;
            }

            if (comboBox1.Text == "")
            {
                comboBox1.Focus();
                return false;
            }
            else
            {
                if (comboBox1.Text == "Física" && comboBox2.Text == "")
                {
                    comboBox2.Focus();
                    return false;
                }
            }

            switch (origem)
            {
                case Entidade.Usuario:
                    if (txtNomeUsuario.Text == "")
                    {
                        txtNomeUsuario.Focus();
                        return false;
                    }

                    if (txtSenha.Text == "")
                    {
                        txtSenha.Focus();
                        return false;
                    }

                    break;
            }

            return true;
        }

        #region CarregaControles
        private void CarregaCampos()
        {
            pessoa = bd.Pessoa.FirstOrDefault(x => x.idPessoa == idPessoa);
            if (pessoa == null)
            {
                throw new Exception("Não é possível prosseguir com a consulta/alteração.");
            }

            CarregaCtrlPessoa();

            AtualizaGridTelefone();

            AtualizaGridEndereco();

            switch (origem)
            {
                case Entidade.Usuario:
                    CarregaCtrlUsuario();
                    break;
                case Entidade.Cliente:
                    CarregaCtrlCliente();
                    break;
                case Entidade.Passageiro:
                    CarregaCtrlPassageiro();
                    break;
                case Entidade.Fornecedor:
                    CarregaCtrlFornecedor();
                    break;
            }            
        }

        private void AtualizaGridEndereco()
        {
            grdEnderecos.DataSource = from x in bd.Endereco
                                      where x.Pessoa.idPessoa == idPessoa
                                      select new { ID = x.idEndereco, Endereço = x.logradouro, Número = x.numero, Bairro = x.Bairro.nome, Cidade = x.Bairro.Cidade.nome }; //bd.Endereco.Where(x => x.Pessoa.idPessoa == idPessoa);
        }

        private void AtualizaGridTelefone()
        {
            grdTelefones.DataSource = from x in bd.Telefone
                                      where x.Pessoa.idPessoa == idPessoa
                                      select new { ID = x.idTelefone, DDD = x.ddd, Número = x.numero, Contato = x.contato, Observação = x.obs };  //bd.Telefone.Where(x => x.Pessoa.idPessoa == idPessoa);
        }

        private void CarregaCtrlFuncionario()
        {
            funcionario = bd.Funcionario.FirstOrDefault(x => x.Pessoa.idPessoa == idPessoa);
            if (funcionario == null)
            {

            }
            else
            {
                tabControl1.TabPages.Add(tabFunc);

                txtIDFunc.Text = funcionario.idFuncionario.ToString();
                txtEntrada.Text = funcionario.entrada.Value.ToShortDateString();
                txtSaida.Text = funcionario.saida.Value.ToShortDateString();
                txtSalario.Text = funcionario.salario.Value.ToString();
                txtRamal.Text = funcionario.ramal.Value.ToString();
                txtEmailFunc.Text = funcionario.email;
                cbAtivoFunc.Checked = funcionario.ativo.Value;

                CarregaCtrlMotorista();
            }
        }

        private void CarregaCtrlMotorista()
        {
            motorista = bd.Motorista.FirstOrDefault(x => x.Funcionario.idFuncionario == funcionario.idFuncionario);
            if (motorista == null)
            {

            }
            else
            {
                tabControl2.TabPages.Add(tabMotorista);

                txtIDMotorista.Text = motorista.idMotorista.ToString();
                txtCNHNum.Text = motorista.CNH;
                txtCNHValidade.Text = motorista.validade.ToShortDateString();
                chkHabA.Checked = motorista.catA;
                chkHabB.Checked = motorista.catB;
                chkHabC.Checked = motorista.catC;
                chkHabD.Checked = motorista.catD;
                chkHabE.Checked = motorista.catE;
            }
        }

        private void CarregaCtrlFornecedor()
        {
            fornecedor = bd.Fornecedor.FirstOrDefault(x => x.idPessoa == idPessoa);
            if (fornecedor == null)
            {

            }
            else
            {
                txtFornecedor.Text = fornecedor.idFornecedor.ToString();
                lblFornecedor.Visible = true;
                txtFornecedor.Visible = true;
            }
        }

        private void CarregaCtrlPassageiro()
        {
            passageiro = bd.Passageiro.FirstOrDefault(x => x.idPassageiro == idPessoa);
            if (fornecedor == null)
            {

            }
            else
            {
                txtPassageiro.Text = passageiro.idPassageiro.ToString();
                lblPassageiro.Visible = true;
                txtPassageiro.Visible = true;
            }
        }

        private void CarregaCtrlCliente()
        {
            cliente = bd.Cliente.FirstOrDefault(x => x.idPessoa == idPessoa);
            if (cliente == null)
            {

            }
            else
            {
                txtCliente.Text = cliente.idCliente.ToString();
                lblCliente.Visible = true;
                txtCliente.Visible = true;
            }
        }

        private void CarregaCtrlUsuario()
        {
            usuario = bd.Usuario.FirstOrDefault(x => x.Pessoa.idPessoa == idPessoa);
            if (usuario == null)
            {

            }
            else
            {
                tabControl1.TabPages.Add(tabUsu);

                txtIDUsuario.Text = usuario.idUsuario.ToString();
                txtNomeUsuario.Text = usuario.nome;
                txtSenha.Text = WBGDal.clsDalCriptografia.Descrypt(usuario.senha);
                senhaAnt = txtSenha.Text;
                cbAtivoUsuario.Checked = usuario.ativo;
            }
        }

        private void CarregaCtrlPessoa()
        {
            txtIDPessoa.Text = pessoa.idPessoa.ToString();
            txtNomePessoa.Text = pessoa.nome;
            txtNascimento.Text = pessoa.nascimento.ToShortDateString();

            switch (pessoa.tipo)
            {
                case "F":
                    comboBox1.Text = "Física";
                    switch (pessoa.tipo)
                    {
                        case "F":
                            comboBox2.Text = "Feminino";
                            break;
                        case "M":
                            comboBox2.Text = "Masculino";
                            break;
                    }
                    break;
                case "J":
                    comboBox1.Text = "Jurídica";
                    break;
            }

            if (pessoa.cpf_cnpj != null && pessoa.cpf_cnpj.CompareTo("") != 0)
            {
                string format = pessoa.tipo.CompareTo("F") == 0 ? @"{0:000\.000\.000\-00}" : @"{0:00\.000\.000\/0000\-00}";
                txtCPFCNPJ.Text = pessoa.cpf_cnpj; //String.Format(format, Convert.ToInt64(pessoa.cpf_cnpj));
            }

            if (pessoa.rg != null && pessoa.rg.CompareTo("") != 0)
            {
                //string format = @"{0:00\.000\.000\-0}";
                txtRG.Text = pessoa.rg; //String.Format(format, Convert.ToInt64(pessoa.rg));
            }
        }

        #endregion

        #region CarregaRegistros
        private void CarregaRegistros(bool add)
        {
            CarregaPessoa(add);
            switch(origem)
            {
                case Entidade.Usuario:
                    CarregaUsuario(add);
                    break;
                //case Entidade.Funcionario:
                //case Entidade.Motorista:
                //    CarregaFuncionario(add);
                //    break;
                case Entidade.Cliente:
                    CarregaCliente(add);
                    break;
                case Entidade.Passageiro:
                    CarregaPassageiro(add);
                    break;
                case Entidade.Fornecedor:
                    CarregaFornecedor(add);
                    break;
                default:
                    throw new Exception("Problemas ao realizar a inclusão.");
            }
        }

        private void CarregaFuncionario(bool add)
        {
            //funcionario.idFuncionario = Convert.ToInt32(txtIDFunc.Text);
            funcionario.idPessoa = pessoa.idPessoa;
            funcionario.entrada = Convert.ToDateTime(txtEntrada.Text);
            funcionario.saida = Convert.ToDateTime(txtSaida.Text);
            funcionario.salario = Convert.ToDecimal(txtSalario.Text);
            funcionario.ramal = Convert.ToInt32(txtRamal.Text);
            funcionario.email = txtEmailFunc.Text;
            funcionario.ativo = cbAtivoFunc.Checked;

            if (add)
            {
                bd.Funcionario.AddObject(funcionario);
            }
            bd.SaveChanges();

            CarregaMotorista(add);
        }

        private void CarregaMotorista(bool add)
        {
            //motorista.idMotorista = Convert.ToInt32(txtIDMotorista.Text);
            motorista.CNH = txtCNHNum.Text;
            motorista.validade = Convert.ToDateTime(txtCNHValidade.Text);
            motorista.catA = chkHabA.Checked;
            motorista.catB = chkHabB.Checked;
            motorista.catC = chkHabC.Checked;
            motorista.catD = chkHabD.Checked;
            motorista.catE = chkHabE.Checked;

            if (add)
            {
                bd.Motorista.AddObject(motorista);
            }
            bd.SaveChanges();
        }

        private void CarregaFornecedor(bool add)
        {
            fornecedor.idPessoa = pessoa.idPessoa;
            fornecedor.ativo = true;

            if (add)
            {
                bd.Fornecedor.AddObject(fornecedor);
            }
            bd.SaveChanges();
        }

        private void CarregaPassageiro(bool add)
        {
            passageiro.idPessoa = pessoa.idPessoa;

            if (add)
            {
                bd.Passageiro.AddObject(passageiro);
            }
            bd.SaveChanges();
        }

        private void CarregaCliente(bool add)
        {
            cliente.idPessoa = pessoa.idPessoa;

            if (add)
            {
                bd.Cliente.AddObject(cliente);
            }
            bd.SaveChanges();
        }

        private void CarregaUsuario(bool add)
        {
            usuario.idPessoa = pessoa.idPessoa;
            usuario.nome = txtNomeUsuario.Text;
            usuario.senha = WBGDal.clsDalCriptografia.Encrypt(txtSenha.Text);
            usuario.ativo = cbAtivoUsuario.Checked;

            if (add)
            {
                bd.Usuario.AddObject(usuario);
            }

            bd.SaveChanges();
        }

        private void CarregaPessoa(bool add)
        {
            //pessoa.idPessoa = Convert.ToInt32(txtIDPessoa.Text);
            pessoa.nome = txtNomePessoa.Text;
            pessoa.nascimento = Convert.ToDateTime(txtNascimento.Text);
            pessoa.cpf_cnpj = txtCPFCNPJ.Text.Replace(".", "").Replace("\\", "").Replace("-","");
            pessoa.tipo = comboBox1.Text.Substring(0, 1);

            if (pessoa.tipo == "J")
            {
                pessoa.sexo = "";
                pessoa.rg = "";
            }
            else
            {
                pessoa.sexo = comboBox2.Text.Substring(0, 1);
                pessoa.rg = txtRG.Text.Replace(".", "").Replace("-", "");
            }

            if (add)
            {
                bd.Pessoa.AddObject(pessoa);
            }
            bd.SaveChanges();
        }

        #endregion

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch(comboBox1.SelectedIndex)
            {
                case 0: //Física
                    comboBox2.Enabled = true;
                    txtRG.Enabled = true;
                    txtCPFCNPJ.MaxLength = 11;
                    break;
                case 1: //Jurídica
                    comboBox2.Enabled = false;
                    txtRG.Enabled = false;
                    txtCPFCNPJ.MaxLength = 14;
                    break;
            }
        }

        private void txtCPFCNPJ_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.PermiteNumero(e.KeyChar);
        }

        private void txtRG_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.PermiteNumero(e.KeyChar);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Deseja realmente excluir?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
                    return;

                int id = Convert.ToInt32(grdTelefones.CurrentRow.Cells[0].Value);
                var tel = bd.Telefone.FirstOrDefault(x => x.idTelefone == id);
                bd.Telefone.DeleteObject(tel);
                bd.SaveChanges();
                AtualizaGridTelefone();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao excluir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Deseja realmente excluir?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
                    return;

                int id = Convert.ToInt32(grdEnderecos.CurrentRow.Cells[0].Value);
                var end = bd.Endereco.FirstOrDefault(x => x.idEndereco == id);
                bd.Endereco.DeleteObject(end);
                bd.SaveChanges();
                AtualizaGridEndereco();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao excluir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            frmTelefone3C frm = null;
            try
            {
                if (request == Request.Inserir)
                {
                    MessageBox.Show("Por favor, conclua a inclusão da pessoa e retorne para inserir os telefones.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                frm = new frmTelefone3C(Request.Inserir, pessoa.idPessoa);
                frm.ShowDialog();
                AtualizaGridTelefone();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao inserir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (frm != null)
                    frm.Dispose();
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            frmEndereco3C frm = null;
            try
            {
                if (request == Request.Inserir)
                {
                    MessageBox.Show("Por favor, conclua a inclusão da pessoa e retorne para inserir os endereços.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                frm = new frmEndereco3C(Request.Inserir, pessoa.idPessoa);
                frm.ShowDialog();
                AtualizaGridEndereco();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao inserir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (frm != null)
                    frm.Dispose();
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                int id = Convert.ToInt32(grdEnderecos.CurrentRow.Cells[0].Value);
                var frm = new frmEndereco3C(Request.Alterar, id);
                frm.ShowDialog();
                AtualizaGridEndereco();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao alterar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                int id = Convert.ToInt32(grdTelefones.CurrentRow.Cells[0].Value);
                var frm = new frmTelefone3C(Request.Alterar, id);
                frm.ShowDialog();
                AtualizaGridTelefone();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao alterar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}